package snmpagent;

import java.sql.*;
import java.io.*;


/**
 * Proyecto: Java hora 0
 * Title: Clase ejecutorSQLAvanzado
 * File: ejecutorSQLAvanzado.java
 * Description: Clase que ejecuta sentencias sql y las muestra en pantalla 
 * (sin importar la cantidad de columnas que tengan los resultados)
 * 		Pr�ctica de la utilizaci�n del objeto ResultSet	(para obtener datos de los resultados)
 *		Pr�ctica de la utilizaci�n del objeto ResultSetMetaData (para obtener informaci�n acerca de cada columna de los resultados)
 * Copyright: Copyright (c) 2002
 * @author Jairo Vergara
 * @version 2.0  
 */ 
public class ejecutorSQLAvanzado {

	//ATRIBUTOS
	/*
	 *Atributo que mantiene la conexi�n con la BD
	 */
	private Connection miConexion;
	/*
	 *Objeto que permite ejecutar consultas SQL
	 */
	private Statement stmt;
	/*
	 *Ubicaci�n de la bd
	 */
	private String url;
	/*
	 *Login
	 */
	private String usuario;
	/*
	 *Password
	 */
	private String password;
	

	/*
	 *M�todo constructor
	 */
	public ejecutorSQLAvanzado(String url, String usuario, String password){
		//Asignaci�n de atributos
		this.url = url;	
		this.usuario = usuario;
		this.password = password;
	}
	
	/*
	 *M�todo que permite realizar la conexi�n a la BD
	 *@return true si la conexi�n fue exitosa
	 */
	public boolean conectar(){				
		//Creaci�n del driver que permite manejar la conexi�n...
		try {
			//creaci�n de un driver que maneja una conexi�n odbc
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
		} catch(ClassNotFoundException e) {
			System.out.println("driver (Clase) no encontrado"); 
			return false;
		}

		//creaci�n de la conexi�n...
		try {
			miConexion = DriverManager.getConnection(url,usuario, password);
		} catch(SQLException ex) {
			System.out.println("Error de SQL en creación de conexión!!");
			//System.err.println("SQLException: " + ex.getMessage());
			return false;
		}
		
		//la conexi�n fue exitosa
		return true;
	}


    public void ejecutarActualizacion(String strConsulta){

        try{
			//Creaci�n de una sentencia para ejecutar la consulta
			stmt = miConexion.createStatement();
            stmt.executeUpdate(strConsulta);

        }catch(SQLException e){
            e.printStackTrace();
			System.out.println("Error de SQL en ejecución de consulta!!!");
		}
    }
	
	/*
	 *Verifica si la conexi�n es exitosa
	 */
	public String ejecutarConsulta(String strConsulta){

        String respuesta="";
		//Objeto que almacenar� el resultado de la consulta SQL
		ResultSet rs;
		//Objeto que almacenar� informaci�n acerca de cada columna de la tabla de resultados
		//de la consulta (nombre de la columna, tipo, etc)
		ResultSetMetaData rsmd;
		
		try{
			//Creaci�n de una sentencia para ejecutar la consulta
			stmt = miConexion.createStatement();
			//ejecuci�n de la consulta
			
            
            
            
			rs = stmt.executeQuery(strConsulta);
	   		if( rs != null){
				//Existen resultados de la consulta ejecutada
				//se puede entonces acceder a esos resultados a trav�s del objeto ResultSet
		
				//�Se hace una instancia del objeto que contiene los metadatos de los resultados
				rsmd = rs.getMetaData();
				
				//obtener un texto que almacene los nombres de cada columna separados por TAB
				//se env�a como par�metro el objeto que contiene esta informaci�n
//				String nombresColumnas = obtenerNombresColumnas(rsmd);
//				System.out.println(nombresColumnas);
//				respuesta = respuesta.concat(nombresColumnas+"\n");
				
				
				//ahora hay que recorrer los resultados...
				//para esto se tendr� un texto (String) que tendr� el valor
				//de cada columna correspondiente a cada registro (fila)
				//concatenados para as� tener un �nico String
				String filaResultados;
				
				
				//haga mientras existan filas en la tabla de resultados...
				while(rs.next()){
					//se obtiene un testo (String) que contiene el registro completo
					//(valores separados por TAB)
					//para esto es necesario enviar como par�metros
					//tanto el objeto que contiene los resultados (rs)
					//como el que contiene su descripci�n (rsmd)
					filaResultados = obtenerFilaResultados(rs, rsmd);
					
					//ya se tiene un texto con el registro completo
//					System.out.println(filaResultados);	
					respuesta = respuesta.concat(filaResultados+"\n");	
				}
			}else{
				//No hubo resultados luego de la consulta
				System.out.println("No hay resultados");
			}

		}catch(SQLException e){
            e.printStackTrace();
			System.out.println("Error de SQL en ejecución de consulta!!!");
		}		
		return respuesta;
	}
	


    /*
	 *Verifica si la conexi�n es exitosa
	 */
	public ResultSet ejecutarConsultaRs(String strConsulta){
		//Objeto que almacenar� el resultado de la consulta SQL
		try{
			stmt = miConexion.createStatement();
			return stmt.executeQuery(strConsulta);
		}catch(SQLException e){
            e.printStackTrace();
			System.out.println("Error de SQL en ejecución de consulta!!!");
            return null;
		}
	}
	/*
	 *M�todo que obtiene los nombres de cada columna de la tabla de resultados
	 *obtenidos luego de una consulta SQL
	 *@param rsmd Objeto que contiene toda la informaci�n (metadatos) acerca de las columnas de los resultados
	 */
	private String obtenerNombresColumnas(ResultSetMetaData rsmd){

		String nombresColumnas = "";

		try{
			//�Cu�ntas columnas tienen los resultados?
			int contadorColumnas=rsmd.getColumnCount();
				
			//Luego de obtener el n�mero de columnas, se obtiene el nombre
			//de cada una de ellas
			
	         for ( int i = 1; i <= contadorColumnas; ++i ){
	            
	            //si es la primera vez que se ejecuta este ciclo no es necesario concatenar valores
	            if(nombresColumnas.compareTo("")==0)
	              nombresColumnas = rsmd.getColumnName( i );
	            else
	              nombresColumnas += "\t" + rsmd.getColumnName( i );	//"\t" = TAB
	              
	         }
		}catch(SQLException e){
			System.out.println("Error de SQL!!");
		}
		
		return nombresColumnas;
	}
	
	/*
	 *M�todo que obtiene todos los valores de un registro (columna a columna)
	 * y los concatena para devolver un �nico String
	 * Nota:  Cada valor estar� separado por TAB
	 *@param rs Objeto que contiene los resultados
	 *@param srmd Objeto que contiene las descripciones
	 */
	private String obtenerFilaResultados(ResultSet rs, ResultSetMetaData rsmd){

		//variable que almacenar� los resultados		
		String filaResultados = "";
		
		//variable que almacenar� resultados parciales (valor particular de cada columna)
		String valorColumna = "";
		
		try{
			//�Cu�ntas columnas tienen los resultados?
			int contadorColumnas=rsmd.getColumnCount();
			
			//ahora se pueden recorrer todas las columnas
			for ( int i = 1; i <= contadorColumnas; ++i ){
				//�De qu� tipo de dato es la columna que se est� evaluando?
	         	switch( rsmd.getColumnType( i ) ) {
	         		//tipo de dato: Texto (String)
		            case Types.VARCHAR:
		            	valorColumna =  rs.getString( i ) ;
		            	break;
		            //tipo de dato: Num�rico (entero)
		            case Types.INTEGER:
		            	//se debe de hacer una conversi�n de un n�mero a un texto
		               valorColumna = new Long( rs.getLong( i ) ).toString() ;
		               break;
		             //tipo de dato: Desconocido (fecha, alg�n tipo particular, etc)
		            default:
		            	//se imprime en pantalla el tipo de dato desconocido
		            	//usando el m�todo getColumnTypeName
		               System.out.println( "Tipo de datos desconocido: " + rsmd.getColumnTypeName( i ) );
	         	}
	         	
	         	//ya se tiene el valor de la columna
	         	//ahora se debe de concatenar a los valores ya le�dos
	         	
	         	//si es la primera vez que se ejecuta este ciclo no es necesario concatenar valores
	            if(filaResultados.compareTo("")==0)
	              filaResultados = valorColumna;
	            else
	              filaResultados += "\t" + valorColumna;	//"\t" = TAB
	         	
	         }

		}catch(SQLException e){
			System.out.println("Error de SQL!!");
		}
		
		return filaResultados;
	}
	
	/*
	 *Cierra la conexi�n con la BD
	 */
	public void cerrarConexion(){
		try{
			stmt.close();
			miConexion.close();
		}catch(SQLException e){
			System.out.println("Error de SQL!!!");
		}
	}
	
	
	/*
	 *M�todo principal
	 
	public static void main(String args[]){
		//Creaci�n de una instancia de la clase pruebaSQL		
		//ejecutorSQLAvanzado test = new ejecutorSQLAvanzado("jdbc:odbc:cursoRedes","login","password");
		
		//File f = new File("");
        //String db = "Driver={Microsoft Access Driver (*.mdb)};DBQ="+f.getAbsolutePath()+"\\cursoRedes.mdb";
        //ejecutorSQLAvanzado test = new ejecutorSQLAvanzado("jdbc:odbc:"+db,"login","password");
		
		//Posibles actividades por desarrollar
		// 1- Leer consulta SQL desde teclado
		// 2- Enviar resultado a un archivo (cambiar system.out.println)
		//    -Dicho nombre de archivo tambi�n debe de ser le�do desde teclado
		// 3- Hacer un ciclo de lecturas de consultas hasta que se escriba la palabra: "EXIT"
		
		//verificaci�n de la conexi�n
		
//		if(test.conectar()){
//			test.ejecutarConsulta("select Telefono from Personas");
//			test.cerrarConexion();
//		}
		
		//ahora se debe de cerrar la conexi�n
		
				
	}*/
}